//系统方案

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

#define LOG "log.txt"

int main(){
  umask(0);
  //O_CREAT | O_WRONLY:默认不会对原始文件内容做清空
  
  //将文件做清空O_TRUNC
  //int fd = open(LOG, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  
  //追不需要再加清空符了,写入的策略
  //int fd = open(LOG, O_WRONLY | O_CREAT | O_APPEND, 0666);
  
  //仅读
  int fd = open(LOG, O_RDONLY, 0666);
  if (fd == -1){
    printf("fd: %d, errno: %d, errstring: %s\n", fd, errno, strerror(errno));
  }else{
    printf("fd: %d, errno: %d, errstring: %s\n", fd, errno, strerror(errno));
  }
  //读取
  char buffer[1024];

  //这里我们无法做到按行读取，我们是整体读取的
  ssize_t n = read(fd, buffer, sizeof(buffer) - 1);//使用系统接口来进行IO的时候注意 \0问题
  if (n > 0){
    buffer[n] = '\0';

    printf("%s\n", buffer);
  }

  //写入 - C语言上的文件接口和系统文件接口之间的关系 -- C语言是对系统的封装 库函数 底层 调用 系统调用
//  const char* msg = "hello bite, hello 107";
//  int cnt = 5;
//
//  while (cnt){
//    char line[128];
//    snprintf(line, sizeof(line), "%s, %d\n", msg, cnt);
//
//    write(fd, line, strlen(line));//这里的strlen 要不要+1?1,0
//    //不要加 1 因为/0是C语言的规定，不是文件的规定
//    cnt--;
//  }
//
  close(fd);

  return 0;
}

